#include <stdio.h>
#include "lista.h"
#include "system.h"
#include "parser.h"
#include "fixture.h"
#include "print.h"
#include "codigos_print.h"

bool iniciar_sistema()
{
	if (System_Init() != EXITO)
		return false;

	bool resultado = EXITO == System_Install("agregar_resultado", (comando_t)agregar_resultado);
	resultado &= EXITO == System_Install("listar_jugadores", (comando_t)listar_jugadores);
	resultado &= EXITO == System_Install("listar_goleador", (comando_t)listar_goleador);
	resultado &= EXITO == System_Install("goles_jugador", (comando_t)goles_jugador);
	resultado &= EXITO == System_Install("mostrar_resultado", (comando_t)mostrar_resultado);

	// Si falló la instalación cerramos el sistema.
	if (!resultado)
		System_Close();

	return resultado;
}

int main(int argc, char **argv)
{
	if (argc < 2)
		{
			printf("Usage:\n\t%s <path to file>\n",argv[0]);
			return 0;
		}

	fprintf(stderr,"Iniciando sistema...\n");
	if (!iniciar_sistema())
		{
			fprintf(stderr,"An unexpected error ocurred\n");
			return -1;
		}

	fprintf(stderr,"Generando estructuras de datos internas...\n");
	fixture_t* fixture = fixture_crear();
	if (!fixture)
	{
		System_Close(); // Destruímos el sistema.
		fprintf(stderr,"An unexpected error ocurred\n");
		return -1;
	}

	fprintf(stderr,"Abriendo archivo %s...\n",argv[1]);
	FILE *file = fopen(argv[1],"r");
	if (!file)
		{
			fprintf(stderr,"An unexpected error ocurred\n");
			return -1;
		}

	fprintf(stderr,"Cargando fixture. Por favor espere...\n");
	fixture_cargar(fixture, file);
	fclose(file);

	fprintf(stderr,"Sistema en linea. Aguardando ordenes...\n\n");
	char *linea = NULL;
	while (!feof(stdin) && ((linea = linea_siguiente(stdin)) != NULL))
	{
		lista_t *parametros = comando_extraer(linea);
		// Liquidamos la linea: ya no la necesitamos.
		free(linea);
		System_execute(fixture, parametros);
		// Liquidamos la lista: ya no la necesitamos.
		lista_destruir(parametros,free);
	}
	fixture_destruir (fixture);
	System_Close();
	return 0;
}
